#include "comm.h"

int CreateShm(const char * fname, int proj_id)
{
    key_t key = ftok(fname, proj_id);
	if (key < 0) {
		perror("CreateShm:ftok");
		return -1;
	}

	int shmid = shmget(key, SHM_SIZE, IPC_PRIVATE | IPC_CREAT | IPC_EXCL | 0666);
	if (shmid  < 0) {
		perror("CreateShm:shmget");
		return -1;
	}

	return shmid;
}

int DestroyShm(int shmid)
{
    if(shmctl(shmid,IPC_RMID,NULL) < 0)
	{
		perror("DestroyShm:shmctl");
		return -1;
	}

    return 0;
}

int CreateSem(const char * fname, int proj_id)
{
    key_t key = ftok(fname, proj_id);
    if (key < 0) {
        perror("CreateSem:ftok");
        return -1;
    }

	int semid = semget(key, 1, IPC_PRIVATE | IPC_CREAT | IPC_EXCL | 0666);
    if (semid < 0) {
        perror("CreateSem:semget");
        return -1;
    }

    return semid;
}

int InitSem(int semid, int val)
{
    union semun _semun;
    _semun.val = val;
    
    if (semctl(semid, 0, SETVAL, _semun) < 0){
        perror("InitSem:semctl");
        return -1;
    }

    return 0;
}

int DestroySem(int semid)
{
    if (semctl(semid, 0, IPC_RMID) < 0) {
        perror("DestroySem:semctl");
        return -1;
    }

    return 0;
}

int P(int semid)
{
    struct sembuf _sf{
        .sem_num = 0,
        .sem_op = -1,
        .sem_flg = SEM_UNDO
    };
    if (semop(semid, &_sf, 1) < 0) {
        perror("P:semop");
        return -1;
    }

    return 0;
}

int V(int semid)
{
    struct sembuf _sf{
        .sem_num = 0,
        .sem_op = 1,
        .sem_flg = SEM_UNDO
    };
    if (semop(semid, &_sf, 1) < 0) {
        perror("P:semop");
        return -1;
    }

    return 0;

}


